[IA64] linux: arch_free_page()
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Tue, 9 May 2006 17:42:26 +0000 (11:42 -0600)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Tue, 9 May 2006 17:42:26 +0000 (11:42 -0600)
add defeinitions of arch_free_page()
work around for PG_foreign. xen/ia64 uses PG_arch1.
This work around sould be removed once PG_foreign is taken.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c
linux-2.6-xen-sparse/include/asm-ia64/page.h

index 91b3bf39b7b3bbfe20c2aab9d5d97efa1fe2f533..5873601b5b07ccceab29566cb9aad395e2a46d02 100644 (file)
@@ -285,3 +285,8 @@ EXPORT_SYMBOL(balloon_dealloc_empty_page_range);
 EXPORT_SYMBOL(balloon_update_driver_allowance);
 
 
+///////////////////////////////////////////////////////////////////////////
+// PageForeign(), SetPageForeign(), ClearPageForeign()
+
+struct address_space xen_ia64_foreign_dummy_mapping;
+
index c791541c7f288a29d8332f849b1fec498c5e5e97..e99838c6167dbdf342155af63e915b71880a1fee 100644 (file)
@@ -235,6 +235,41 @@ get_order (unsigned long size)
 #include <linux/kernel.h>
 #include <asm/hypervisor.h>
 
+// XXX hack!
+//     Linux/IA64 uses PG_arch_1.
+//     This hack will be removed once PG_foreign bit is taken.
+//#include <xen/foreign_page.h>
+#ifdef __ASM_XEN_FOREIGN_PAGE_H__
+# error "don't include include/xen/foreign_page.h!"
+#endif
+
+extern struct address_space xen_ia64_foreign_dummy_mapping;
+#define PageForeign(page)      \
+       ((page)->mapping == &xen_ia64_foreign_dummy_mapping)
+
+#define SetPageForeign(page, dtor) do {                                \
+       set_page_private((page), (unsigned long)(dtor));        \
+       (page)->mapping = &xen_ia64_foreign_dummy_mapping;      \
+       smp_rmb();                                              \
+} while (0)
+
+#define ClearPageForeign(page) do {    \
+       (page)->mapping = NULL;         \
+       smp_rmb();                      \
+       set_page_private((page), 0);    \
+} while (0)
+
+#define PageForeignDestructor(page)    \
+       ( (void (*) (struct page *)) page_private(page) )
+
+#define arch_free_page(_page,_order)                   \
+({      int foreign = PageForeign(_page);               \
+       if (foreign)                                    \
+               (PageForeignDestructor(_page))(_page);  \
+       foreign;                                        \
+})
+#define HAVE_ARCH_FREE_PAGE
+
 //XXX xen page size != page size
 
 static inline unsigned long
@@ -279,6 +314,9 @@ machine_to_phys_for_dma(unsigned long machine)
 #define set_phys_to_machine(pfn, mfn) do { } while (0)
 #define xen_machphys_update(mfn, pfn) do { } while (0)
 
+//XXX to compile set_phys_to_machine(vaddr, FOREIGN_FRAME(m))
+#define FOREIGN_FRAME(m)        (INVALID_P2M_ENTRY)
+
 #define mfn_to_pfn(mfn)                        (mfn)
 #define mfn_to_virt(mfn)               (__va((mfn) << PAGE_SHIFT))
 #define pfn_to_mfn(pfn)                        (pfn)